package services.impl;

import java.util.Date;
import java.util.List;

import javax.ejb.EJB;
import javax.ejb.Stateless;

import services.CotizacionService;
import services.ListaPreciosService;
import services.PorcentajeGananciaService;
import services.RodamientoService;
import entities.Cotizacion;
import entities.ItemCotizacion;
import entities.ItemListaPrecios;
import entities.PorcentajeGanancia;

@Stateless
public class CotizacionServiceBean implements CotizacionService {
	
	@EJB
	private RodamientoService rodamientoService;
	@EJB
	private ListaPreciosService listaPreciosService;
	@EJB
	private PorcentajeGananciaService porcentajeGananciaService;
	
	@Override
	public Cotizacion cotizar(List<ItemCotizacion> items) {
		Cotizacion cot = new Cotizacion();
		cot.setVigencia(15);
		cot.setFechaEmision(new Date());
		for (ItemCotizacion itemCot : items) {
			setMejorPrecio(itemCot);
		}
		cot.setListaItemCotizacion(items);
		return cot;
	}

	/**
	 * Se setea en itemCot el precio mas bajo de los item que correspandan con el rodamiento a cotizar, y se setea a
	 * que lista pertenece 
	 * @param itemCot
	 * @param listas
	 */
	private void setMejorPrecio(ItemCotizacion itemCot) {
		ItemListaPrecios itemMejorPrecio = null;
		//Busco el item que tenga el mejor precio
		//Seteo el stock que se puede satisfacer
		itemMejorPrecio =  listaPreciosService.obtenerItemMejorPrecio(itemCot.getRodamiento());
		//si se encontro al menos un rodamiento que cumpla con los parametros se le setea la cantidad a satisfacer, el precio de ese rodamiento y el id de la lista a la que pertenece
		if (itemMejorPrecio != null){
			setearStockASatisfacer(itemCot, itemMejorPrecio);
			itemCot.setPrecio(itemMejorPrecio.getPrecio());
			aplicarPorcentajeDeGanancia(itemCot);
			itemCot.setListaPreciosId(itemMejorPrecio.getIdListaPrecios());
		}
	}

	private void aplicarPorcentajeDeGanancia(ItemCotizacion itemCot) {
		PorcentajeGanancia porcentajeGanancia = porcentajeGananciaService.findByID(1);
		System.out.println("El porcentaje ganancia es de: " + porcentajeGanancia.getPorcentajeGanancia());
		Float gananciaAObtener = (float) (itemCot.getPrecio() * porcentajeGanancia.getPorcentajeGanancia() / 100);
		System.out.println("La ganancia a obtener es de: " + gananciaAObtener);
		itemCot.setPrecio(itemCot.getPrecio()+gananciaAObtener);
	}

	/**
	 * Setea al item cotizacion el stock que se puede satisfacer
	 * @param itemCot
	 * @param itemMejorPrecio
	 * @param stockDisponibleItemMejorPrecioEnCC
	 */
	private void setearStockASatisfacer(ItemCotizacion itemCot,ItemListaPrecios itemMejorPrecio) {
		Integer stockDisponibleItemMejorPrecioEnCC = 0; //es el stock del item en CC + el que puede satisfacer el cliente
		stockDisponibleItemMejorPrecioEnCC = rodamientoService.obtenerStock(itemMejorPrecio.getRodamiento());
		if (itemMejorPrecio.getCantidad()!= null){
			if (stockDisponibleItemMejorPrecioEnCC + itemMejorPrecio.getCantidad() >= itemCot.getCantidad()){
				itemCot.setCantidad(itemCot.getCantidad()); //Esta linea es solo informativa, significa que se puede satisfacer todo 
			}else {
				itemCot.setCantidad(stockDisponibleItemMejorPrecioEnCC + itemMejorPrecio.getCantidad());
			}
		}else{
			if (stockDisponibleItemMejorPrecioEnCC >= itemCot.getCantidad()){
				itemCot.setCantidad(itemCot.getCantidad()); //Esta linea es solo informativa, significa que se puede satisfacer todo 
			}else {
				itemCot.setCantidad(stockDisponibleItemMejorPrecioEnCC);
			}
		}
	}
	
//	private boolean figuraItemEnListaDePrecios(ListaPrecios listaPrecios, ItemCotizacion itemCotizacion){
//		//TODO refactorear esto, buscar correctamente el item cotizacion dentro de la lista de precios
//		int itemIndice =  listaPrecios.getItems().indexOf(itemCotizacion);
//		if(itemIndice >= 0){
//			return true;
//		}else{
//			return false;
//		}
//		
//	}

	
}
